runtime: implement weak.runtime_makeStrongFromWeak - #5633
Open
yohimik wants to merge 1 commit into
Open
Conversation
This was referenced Aug 30, 2026
The runtime had weak.runtime_registerWeakPointer but not its counterpart, so a program that reads a weak pointer back did not link. crypto/tls does this in the certificate cache that it keeps behind a weak.Pointer. Weak pointers are not weak here. registerWeakPointer returns the pointer that it got, so the value it refers to stays and the way back to a strong pointer is the identity too. weak.Pointer.Value thus never reports a collected value, which the documented contract permits. testdata/weak.go does not link on the current dev branch and prints the expected value with this change.
yohimik
force-pushed
the
upstream-pr/weak-strong-from-weak
branch
from
September 2, 2026 08:50
1388449 to
931c476
Compare
Author
|
Rebased on dev after the 0.42.0 release. The change applies on top of v0.42.0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
runtime: implement weak.runtime_makeStrongFromWeak
What this does
The runtime has
weak.runtime_registerWeakPointerbut not its counterpart, so aprogram that reads a weak pointer back does not link. The missing function is 7
lines.
Weak pointers are not weak here.
registerWeakPointerreturns the pointer thatit got, so the value it refers to stays and the way back to a strong pointer is
the identity too.
weak.Pointer.Valuethus never reports a collected value,which the documented contract permits.
Evidence
testdata/weak.gomakes a weak pointer and reads it back. It is registered inTestBuildunder theminor >= 24gate, because theweakpackage came withGo 1.24.
Measured on macOS 26.6 arm64.
weak/pointer.go:89: linker could not find symbol _weak.runtime_makeStrongFromWeakweak value: 42The program also builds for
cortex-m-qemu,riscv-qemuandsimavr.A downstream product also ships binaries built with a fork that carries this
change, in the published release dispat v1.4.0.
https://github.com/yohimik/dispat/releases/tag/services%2Fdispat%2Fv1.4.0
Why it matters
crypto/tlsusesweak.Pointerfor its certificate cache, so this is aprerequisite for the standard library
crypto/tlson any target. Any userprogram that uses
weakhits the same link error today.Scope
src/runtime/runtime.go. No API change, no behaviourchange for a program that does not use
weak.Related pull requests
Each open PR in this series has a separate change. A dependency is not a copied commit.
In tinygo-org/net
Full Darwin networking also needs the merged net changes and a later src/net pin update. No upstream merge or current full-suite pass is implied by this list.
Additional independent gaps found in Crier are covered by #5655 (cookie-jar loader merge) and tinygo-org/net#82 (ListenConfig). They do not duplicate the process, TLS, deadline or server-TLS changes above. Current Crier comparison work is separate from its standard-Go release.
Published fork and downstream evidence
The net.2 fork release combines the coordinated changes at
95fba82a, with net0f460803. It differs from accepted candidatee7d34c8conly in the version constant. Linux, macOS and Windows branch CI and tag CI passed on their first attempts.Dispat source
909dc401, with harness0990c6db, passed 796 test events with no failures or skips on each native Darwin ARM64 and Linux ARM64 candidate run. Crier source7d687fc8passed raw and stripped E2E on native Linux ARM64 and emulated Linux AMD64, each with 144 top-level tests and 156 passing events, no failures or skips. Both applications use TinyGo-built update fixtures and test trusted TLS, certificate refusal, original backup hashes and byte-identical offline rollback. Their workflows also exercise files, environment variables, concurrency and child processes. Crier includes real FFmpeg and webrender/canvas rendering.Crier's unchanged 13-image pixel gate passed. It uses an approved two-line explicit-rounding webrender build patch for both compilers. The earlier gradient mismatch was permitted fused arithmetic, not a TinyGo compiler error. Candidate stripped sizes are 13,835,824 versus 30,277,794 Go bytes on ARM64 (54.30% smaller), and 16,446,968 versus 32,518,306 on AMD64 (49.42% smaller).
These are combined-candidate application results, not proof that this PR alone supplies the features. They supersede the earlier Crier comparison. Published-toolchain probes and application acceptance have since completed. The final Crier v1.1.1 release evidence is below. Dispat controls its own publication. WaitDelay, in-flight deadlines and full descriptor lifetime remain open. This enables tested CLI client workflows, not general Go or server compatibility.
Published Crier v1.1.1 evidence
Crier v1.1.1 is public at source
acac2f0eand uses published TinyGo0.43.0-net.2. Its final acceptance report and SHA-256 manifest identify the exact release bytes. The public tag, asset sizes and report digest were checked. These final sizes supersede the candidate sizes above.The report records 144 top-level tests and 156 passing events for each raw and stripped run on native ARM64 and emulated AMD64, with no failures or skips. It covers real CLI files, environment and concurrent work, child processes, TLS, update/rollback fixtures, uploads, real FFmpeg, and webrender/canvas rendering. The unchanged 13-image gate passes on both targets. AMD64 is exact; ARM64 has 12 exact images and four event-card pixels with channel difference 1. Both compilers use the same explicit-rounding webrender build patch. Standard Go tests, 90.6% coverage, lint and docs also pass.
This is combined-fork application evidence, not isolated proof for this PR or general server support. The generic emulated AMD64
osclosure assertions still fail and also fail with ordinary Go under that emulation; they are not counted as passing. Native AMD64 CI and the final published AMD64netpackage pass. The report retains other platform and deadline/descriptor limits. Tiny binaries are opt-in; normal install/self-update selects standard Go assets.Published Dispat v1.8.1 CLI evidence
Dispat v1.8.1 CLI is public. Its size and SHA-256 manifest records build source
40c58236, Go 1.26.8 and TinyGo0.43.0-net.2. The public asset metadata and manifest digest were checked.These are final published CLI asset sizes, not the earlier candidate measurements. They do not replace the separately identified test evidence or remove known runtime limits. The full release workflow has now completed successfully at the recorded build source, including its Windows, macOS and Ubuntu checks. This does not change the test and platform limits stated above.